﻿\subsubsection{Linux}

В Линуксе, для примера, возьмем структуру \TT{tm} из \TT{time.h}:

\lstinputlisting[style=customc]{patterns/15_structs/3_tm_linux/GCC_tm.c}

Компилируем при помощи GCC 4.4.1:

\lstinputlisting[caption=GCC 4.4.1,style=customasmx86]{patterns/15_structs/3_tm_linux/GCC_tm_RU.asm}

К сожалению, по какой-то причине, \IDA не сформировала названия локальных переменных в стеке. 
Но так как мы уже опытные реверсеры :-) то можем обойтись и без этого в таком простом примере.

\myindex{x86!\Instructions!LEA}
Обратите внимание на \TT{lea edx, [eax+76Ch]} ~--- эта инструкция прибавляет \TT{0x76C} (1900) к \EAX, 
но не модифицирует флаги. См. также соответствующий раздел об инструкции \LEA{}~(\myref{sec:LEA}).


\myparagraph{GDB}

Попробуем загрузить пример в GDB
\footnote{Результат работы \IT{date} немного подправлен в целях демонстрации.
Конечно же, в реальности, нельзя так быстро запустить GDB, чтобы значение секунд осталось бы таким же.}:

\lstinputlisting[caption=GDB]{patterns/15_structs/3_tm_linux/GCC_tm_GDB.txt}

Мы легко находим нашу структуру в стеке.
Для начала, посмотрим, как она объявлена в \IT{time.h}:

\begin{lstlisting}[caption=time.h, label=struct_tm,style=customc]
struct tm
{
  int	tm_sec;
  int	tm_min;
  int	tm_hour;
  int	tm_mday;
  int	tm_mon;
  int	tm_year;
  int	tm_wday;
  int	tm_yday;
  int	tm_isdst;
};
\end{lstlisting}

Обратите внимание что здесь 32-битные \Tint вместо WORD в SYSTEMTIME.
Так что, каждое поле занимает 32-битное слово.

Вот поля нашей структуры в стеке:

\begin{lstlisting}
0xbffff0dc:	0x080484c3	0x080485c0	0x000007de	0x00000000
0xbffff0ec:	0x08048301	0x538c93ed	0x00000025 sec	0x0000000a min
0xbffff0fc:	0x00000012 hour	0x00000002 mday	0x00000005 mon 	0x00000072 year
0xbffff10c:	0x00000001 wday	0x00000098 yday	0x00000001 isdst0x00002a30
0xbffff11c:	0x0804b090	0x08048530	0x00000000	0x00000000
\end{lstlisting}

Либо же, в виде таблицы:

\begin{center}
\begin{tabular}{ | l | l | l | }
\hline
\headercolor{} Шестнадцатеричное число & 
\headercolor{} десятичное число & 
\headercolor{} имя поля \\
\hline
0x00000025 & 37 	& tm\_sec \\
\hline
0x0000000a & 10 	& tm\_min \\
\hline
0x00000012 & 18 	& tm\_hour \\	
\hline
0x00000002 & 2 		& tm\_mday \\	
\hline
0x00000005 & 5 		& tm\_mon \\	
\hline
0x00000072 & 114 	& tm\_year \\
\hline
0x00000001 & 1 		& tm\_wday \\	
\hline
0x00000098 & 152 	& tm\_yday \\	
\hline
0x00000001 & 1 		& tm\_isdst \\
\hline
\end{tabular}
\end{center}

Как и в примере с SYSTEMTIME (\myref{sec:SYSTEMTIME}), здесь есть и другие поля, готовые для использования, 
но в нашем примере они не используются, например, tm\_wday, tm\_yday, tm\_isdst.
